package vip.meeet.thread.lock;

import org.openjdk.jol.info.ClassLayout;
import org.openjdk.jol.info.GraphLayout;


/**
 *
 * 默认开启偏向锁：如果有多个线程无交替使用，则升级为轻量级锁，或者批量修改偏向状态
 *
 * 对象头默认：101
 *
 * 偏向锁：101
 * 无锁：001
 * 轻量级锁：00
 * 重量级锁：10
 *
 * 自旋锁：重量级锁优化，自适应的
 *
 * //关闭延迟开启偏向锁
 * -XX:BiasedLockingStartupDelay=0
 * //禁止偏向锁
 * -XX:-UseBiasedLocking
 * //启用偏向锁
 * -XX:+UseBiasedLocking
 */
public class JOLStart {

    private static class User{
        private Integer id;
        private String name;

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public synchronized void doSomething(){
            System.out.println(ClassLayout.parseInstance(this).toPrintable());
            System.out.println("#################");
        }
    }

    public static void test(){
        User user = new User();
        user.setId(1);
        user.setName("tim");
        //查看对象内部信息
        System.out.println(ClassLayout.parseInstance(user).toPrintable());
        System.out.println("-------------");
        //查看对象外部信息
        System.out.println(GraphLayout.parseInstance(user).toPrintable());
        System.out.println("-------------");
        //查看对象占用空间总大小
        System.out.println(GraphLayout.parseInstance(user).totalSize());
        System.out.println("-------------");
        user.doSomething();
    }

    public static void main(String[] args) {
        test();
    }
}
